/**
 * JFAuthentification.java    01/02/2012
 */

package l3.info.projetJava.client;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

import org.apache.log4j.Logger;

import l3.info.projetJava.utilitaires.Chiffrement;
import l3.info.projetJava.utilitaires.Configuration;

/**
 * Fenêtre de connexion de l'application
 * @author Loic Martinez
 * @version 1.0
 */

public class JFAuthentification extends JFrame implements ActionListener {

    /** Constantes */
    private static final String TITRE = "Identification";
    private static final int LARGEUR = 290;
    private static final int HAUTEUR = 290;
    private static final int ABSCISSE = 500;
    private static final int ORDONNEE = 200;
    private static final String ID = "Identifiant";
    private static final String MDP = "Mot de passe";
    private static final String CNX = "Connexion";
    private static final String QUITTER = "Quitter";
    private final static String[] attributsConfig = {"address", "port"};

    /** Composants de la JFrame */
    private JLabel labelId, labelMdp;
    private JTextField fieldId;
    private JPasswordField fieldMdp;
    private JButton boutonConnexion, boutonQuitter;
    private JPanel firstPan, panImage, pan, panBouton;
    private JMenuBar menuBar;
    private JMenu menuFichier;
    private JMenu menuAide;
    private JMenu menuOption;
    private JMenuItem menuQuitter;
    private JMenuItem menuPreferences;
    private JMenuItem menuAPropos;

    /** Configuration du client */
    private Configuration conf;

    /** Passerelle Client - Serveur via RMI */
    private RequetesClient reqClient;

    /** Logger */
    private static Logger logger = Logger.getLogger(JFAuthentification.class);
    
    /**
     * Constructeur
     */
    public JFAuthentification() {
        // On initialise le titre, la position etc.
        setProperties();
        getContentPane().setLayout(new FlowLayout());

        // On ajoute les différents composants dans la JFrame
        setPicture(FlowLayout.CENTER);
        setLabelAndField(FlowLayout.CENTER);
        setButton(FlowLayout.LEFT);
        setEnter();
        conf = new Configuration("configClient.properties", attributsConfig);
        setVisible(true);
    }

    /**
     * Configuration des propriétés de la JFrame
     */
    private void setProperties() {
        // Configuration de la JFrame
        setTitle(TITRE);
        setLocation(ABSCISSE, ORDONNEE);
        setSize(LARGEUR, HAUTEUR);
        setResizable(false);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        addMenuBar();

        // Ajout du 1er JPanel pour qu'il y ait un peu d'espace
        // avec le haut de la JFrame
        firstPan = new JPanel(new FlowLayout());
        firstPan.setPreferredSize(new Dimension(LARGEUR, 10));
        add(firstPan);
    }

    /**
     * Ajoute le menu Fichier, Options, Aide...
     */
    private void addMenuBar() {
        menuBar = new JMenuBar();
        menuFichier = new JMenu("Fichier");
        menuBar.add(menuFichier);

        menuOption = new JMenu("Options");
        menuBar.add(menuOption);

        menuAide = new JMenu("Aide");
        menuBar.add(menuAide);

        setJMenuBar(menuBar);

        menuQuitter = new JMenuItem("Quitter");
        menuFichier.add(menuQuitter);
        menuQuitter.addActionListener(this);

        menuPreferences = new JMenuItem("Préférences");
        menuOption.add(menuPreferences);
        menuPreferences.addActionListener(this);

        menuAPropos = new JMenuItem("A propos...");
        menuAide.add(menuAPropos);
        menuAPropos.addActionListener(this);
    }

    /**
     * Permet l'ajout du logo dans la JFrame
     * @param alignement, la position
     */
    private void setPicture(int alignement) {

        panImage = new JPanel(new FlowLayout(alignement));
        panImage.setPreferredSize(new Dimension(LARGEUR, 20));

        BufferedImage myPicture;
        try {
            myPicture = ImageIO.read
                    (JFAuthentification.class.getResource("pictures/pony.png"));
            JLabel picLabel = new JLabel(new ImageIcon(myPicture));
            add(picLabel);

            add(panImage);
        } catch (IOException e) {
            logger.error("JFAuthentification.setPicture() : IOException");
        }
    }

    /**
     * Ajoute les labels et textField associés à la JFrame
     * @param alignement, la position
     */
    private void setLabelAndField(int alignement) {

        pan = new JPanel(new FlowLayout(alignement));
        pan.setPreferredSize(new Dimension(LARGEUR, 60));

        labelId = new JLabel(ID + "        ");
        labelMdp = new JLabel(MDP + "  ");

        fieldId = new JTextField(10);
        fieldMdp = new JPasswordField(10);

        pan.add(labelId);
        pan.add(fieldId);

        pan.add(labelMdp);
        pan.add(fieldMdp);

        add(pan);
    }

    /**
     * Ajoute les boutons à la JFrame
     * @param alignement, la position
     */
    private void setButton(int alignement) {

        boutonConnexion = new JButton(CNX);
        boutonConnexion.addActionListener(this);
        boutonQuitter = new JButton(QUITTER);
        boutonQuitter.addActionListener(this);
        panBouton = new JPanel(new FlowLayout(alignement));

        panBouton.add(boutonConnexion);
        panBouton.add(boutonQuitter);
        add(panBouton);
    }

    /**
     * Si on appuie sur Entrée, alors on déclenche le listener
     * du boutonConnexion
     */
    public void setEnter() {
        getRootPane().setDefaultButton(boutonConnexion);
    }

    /**
     * Permet de gérer les actions sur les ActionListeners
     */
    public void actionPerformed(ActionEvent ev) {
        if (ev.getSource() == boutonConnexion) {
            if (fieldId.getText().trim().length() == 0
                    || fieldMdp.getPassword().length == 0) {
                new JDError("Un ou plusieurs champs sont vides");
                fieldId.setText("");
                fieldMdp.setText("");
                // On remet le focus sur le champ Id
                fieldId.requestFocusInWindow();
            } else {
                Utilisateur user = null;
                // Tout est bien rentré, on créé l'utilisateur
                try {
                    int numUser = Integer.parseInt(fieldId.getText());
                    // id, mdp, pseudo, messages
                    user = new Utilisateur
                            (numUser, Chiffrement.toMD5(String.valueOf
                                    (fieldMdp.getPassword())),
                                    null, null, null);

                    try {
                        reqClient = new RequetesClient();
                        user = reqClient.envoyerUtilisateur(user);

                        if (user.getPseudo() != null) {
                            new JFClientConnecte(user);
                            dispose();
                        } else {
                            new JDError("Identifiants incorrects");
                        }

                    } catch (java.lang.NullPointerException ex) {
                        new JDError("Connexion au serveur"
                                + " impossible !");
                        logger.error("JFAuthentification.actionPerformed() : NullPointerException");
                    } catch (RemoteException ex) {
                        new JDError("Connexion au serveur"
                                + " impossible !");
                        logger.error("JFAuthentification.actionPerformed() : RemoteException");
                    } catch (NotBoundException ex) {
                        new JDError("Connexion au serveur"
                                + " impossible !");
                        logger.error("JFAuthentification.actionPerformed() : NotBoundException");
                    }

                } catch (NumberFormatException e) {
                    new JDError("L'identifiant doit être un entier !");
                    fieldId.setText("");
                    fieldMdp.setText("");
                    // On remet le focus sur le champ Id
                    fieldId.requestFocusInWindow();
                }

            }
        } else if (ev.getSource() == boutonQuitter
                || ev.getSource() == menuQuitter) {
            dispose();
        } else if (ev.getSource() == menuPreferences) {
            new JDPreferences(conf);
        } else if (ev.getSource() == menuAPropos) {
            new JDAPropos("Auteurs : Loic Martinez & aboulkacem Hamid ");
        }
    }
}